package com.cskaoyan.market.controller;

import com.cskaoyan.market.db.domain.MarketAdmin;
import com.cskaoyan.market.service.MarketAdminService;
import com.cskaoyan.market.util.ResponseUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpSession;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author 鲸落 功能正常
 * @Date 2024/5/3 16:26
 * @Version 1.0
 */
@RestController
@RequestMapping("admin/auth")
public class AdminAuthController{
    @Autowired
    private MarketAdminService adminService;
    @PostMapping("login")
    //登录的流程：获取接收用户的请求参数信息；校验，系统中进行比对(调用service、mapper)，根据比对的结果返回一个回执信息
    public Object login(@RequestBody Map map, HttpSession session){
        // 使用Map接收请求JSON字符串
        String username = (String) map.get("username");
        String password = (String) map.get("password");
        //做一些校验工作
        if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
            //
            return ResponseUtil.fail(404, "用户名或者密码不能为空");
        }
        //调用模型的代码，也就是进一步去调用service，service进一步去调用mapper
        //返回一个对象还是返回一个数量，查询到的行数？？？？？？应该返回哪一个，取决于后面的业务有没有获取除了用户名以外的其他信息，比如头像等信息
        //返回一个MarketAdmin对象比较合适
        MarketAdmin marketAdmin = adminService.login(username, password);
        if (marketAdmin == null) {
            //todo  记录用户登录失败 logService.addLog();
            //用户名、密码错误    {"errno":605,"errmsg":"用户帐号或密码不正确"}
            //状态码每个小组可以自定义，前端只会去判断是否为0，如果不为0，那么便是出错；至于具体的数字只是为了调用者可以很方便的地排查故障
            return ResponseUtil.fail(605, "用户名或者密码不正确");
        }
        //todo 记录用户登录成功 logService.addLog()
        //用户名、密码匹配------做到和公网具有相同的返回结果
        //设置响应体 字符流  字节流
        Map<String, Object> data = new HashMap<>();
        Map<String, String> adminInfo = new HashMap<>();
        adminInfo.put("nickName", marketAdmin.getUsername());
        adminInfo.put("avatar", marketAdmin.getAvatar());
        data.put("adminInfo", adminInfo);
        //token其实就是session域的编号
        session.setAttribute("admin", marketAdmin);
        data.put("token", session.getId());
        return ResponseUtil.ok(data);
    }
    @GetMapping("info")
    public Object info(HttpSession session) {
        //当前结果需要返回上述的json字符串
        //从session域里面获取
        MarketAdmin admin = (MarketAdmin) session.getAttribute("admin");
        Map<String, Object> data = new HashMap<>();
        //roles和perms是关于权限相关的，大家项目一不用去操心，直接固定写死，让接口通过即可
        data.put("roles", Arrays.asList("超级管理员"));
        data.put("name", admin.getUsername());
        data.put("perms", Arrays.asList("*"));
        data.put("avatar", admin.getAvatar());
        return ResponseUtil.ok(data);
    }

    @PostMapping("logout")
    public Object logout(HttpSession session) {
        //从session域里面移除
        session.removeAttribute("admin");
        return ResponseUtil.ok();
    }
}
